package com.qn.auth;

import com.qn.util.RetFunction;

/**
 * Token持久层接口
 *
 * @author Qning
 * @date 2022/05/13
 */
public interface TokenDao {
    long DEFAULT_EXPIRE = 60;

    int COOKIE_EXPIRE = 60;

    /**
     * 令牌名称
     */
    String TOKEN_NAME = "token";

    String TOKEN_REDIS_KEY = TOKEN_NAME + ":temp-token:";

    /**
     * 写入 Object，并设定存活时间 (单位: 秒)
     *
     * @param key     key
     * @param value   值
     * @param timeout 存活时间
     */
    void setObject(String key, Object value, long timeout);

    /**
     * 获取 Object，如无返空
     *
     * @param key key
     * @return {@link Object}
     */
    Object getObject(String key);

    /**
     * 删除 Object
     *
     * @param key key
     */
    void deleteObject(String key);

    /**
     * 获取 Object 的剩余存活时间 (单位: 秒)
     *
     * @param key key
     * @return long
     */
    Long getObjectTimeout(String key);

    /**
     * 修改Object的剩余存活时间 (单位: 秒)
     *
     * @param key     key
     * @param timeout 过期时间
     */
    void updateObjectTimeout(String key, long timeout);

    /**
     * 取值 (如果值为 null，则执行的函数)
     *
     * @param key 关键
     * @param fun 值为 null 时执行的函数
     * @return 值
     */
    <T> T get(String key, RetFunction fun);
}
